/**
 * 装饰器:装饰器是一-种特殊类型的声明， 它能够被附加到类声明，方法,属性上,可以为原本的代码添加额外的功能。
    通俗的讲装饰器就是一个函数，可以注入到类、方法、属性参数上来扩展类、属性、方法的功能。
    常见的装饰器有:类装饰器、属性装饰器、方法装饰器
    装饰器的写法:普通装饰器(无传参) -、装饰器工厂(可传参)
    装饰器是过去几年中js最大的成就之一。

 */
//装饰器就是一个函数
{
    let classDes = (p: any) => {
        console.log(p, 'p')
        let t = new p()
        console.log(t.name)
    }
    @classDes
    class Person {
        name: string = '张三'
    }

    let classDes1 = (p: any) => {
        return function (target: any) {
            console.log(p, target)//p 参数 target 装饰器的类
        }
    }
    //属性装饰器
    let proDes = (p: any) => {
        return function (target: any, attr: any): any {
            console.log(p, 'p')
            console.log(target, 'target');
            console.log(attr, 'attr');
            console.log(target[attr], 'target[attr]');
        }
    }
    //方法装饰器
    let fnDes = (p: any) => {
        return function (target: any, methodName: any, desc: any) {
            console.log(p, 'p----------------------------------')
            console.log(target, 'target');
            console.log(methodName, 'methodName');
            console.log(desc.value(1, 2), 'desc');
        }
    }

    @classDes1('66666')
    class Person1 {
        name: string = '张三'
        @proDes('参数')
        age: number = 20
        @fnDes('456')
        sum(num1: number, num2: number): number {
            return num1 + num2
        }
    }
    let p = new Person1()
    console.log(p.age, 'p.age');
}
